#include <stdint.h>

typedef struct{
    uint8_t a0:4;
    uint8_t len:4;
    uint8_t type;
    uint16_t arg[0];
    uint32_t arg32[0];
}event;

/*

指针地址 85B9908

type==1
    a0==1
        初始化3000568 - (3000568+8*8) 大小的数据
    a0==0
        返回事件调用方

type=5
    arg[0]
    <i32>arg[1]
        ((u32*)0x30004B0)[arg[0]] = arg[1]
        0x30004B0    地址偏移的数据相当于寄存器   一共 12 个
              0x30004e4 (相对0x30004B0第13个) 相当于sp，用于表示栈深度
              0x30004e8 栈0
              0x30004ec 栈1 ...

type=0xA
    arg[0]
    <i32>arg[1]
        0x3000568等于?
        0x300056C等于当前事件
        设置当前事件指针为arg[1],

type=0x19
    应该是有关游戏全局事件的压栈
    a0
        0:
            0x30004b0[0x30] = (byte)202BCEC[0x1b]
        1:
            0x30004b0[0x30] = event[0x43]
        2:
            if((byte)0x202BCEC[0x14]&0x40&0xff)
                0x30004b0[0x30] = 1;
            else
                0x30004b0[0x30] = 0
        3:
            0x30004b0[0x30] = (byte)0x202BCEC[0x10]
            获得回合数
        4:
            0x30004b0[0x30] = sub_8018D48()
            获得敌方单位的状态0x4  计数 (死亡？不会动？敌人无法攻击?)
                unit[0xc] & 0x4

        5:
            0x30004b0[0x30] = sub_8018D88()
            获得友方单位的状态&0x4 计数
                unit[0xc] & 0x4
        6:
            0x30004b0[0x30] = sub_80C1E74()
            判断章节是否是艾瑞珂?,或者是共同线?
        7:
            if(!(byte)0x202BCEC[0x42])  && !((byte)0x202BCEC[0x14]&0x40)
                0x30004b0[0x30] = 1
            else
                0x30004b0[0x30] = 0
        8:
            0x30004b0[0x30] = sub_8024D98()
            如果是第五章，则返回0
                否则返回 202BCEC[0x8] (第四章为88，前几章为0)
        9:
            0x30004b0[0x30] = sub_80868B0(event[0x48]);
        10:
            if((byte)0x202BCEC[0x14]&0x20&0xff)
                0x30004b0[0x30] = 1;
            else
                0x30004b0[0x30] = 0

type=0xc
    判断条件，并且跳转到arg0 所标志的标签
        如果想比较 type=0x19 的值，则
            arg[0]或arg[1]  为0xc
            如果arg[0]或arg[1]  为(uint32_t*)0x30004B0 偏移
    a0
        >5:
            事件返回6

        0:
            0x30004B0[arg1]!=0x30004B0[arg2]
                返回0
            else
                返回 sub_800DC08(event)
        1:
            0x30004B0[arg1]==0x30004B0[arg2]
                返回0
            else
                返回 sub_800DC08(event)
        2:
            0x30004B0[arg1]<0x30004B0[arg2]
                返回0
            else
                返回 sub_800DC08(event)
        3:
            0x30004B0[arg1]<=0x30004B0[arg2]
                返回0
            else
                返回 sub_800DC08(event)
        4:
            0x30004B0[arg1]>0x30004B0[arg2]
                返回0
            else
                返回 sub_800DC08(event)
        5:
            0x30004B0[arg1]>=0x30004B0[arg2]
                返回0
            else
                返回 sub_800DC08(event)

type=0xd
    arg0:
        1:
            (event[0x3c]>>2 & 1):
                返回0
        0:
            跳转执行(i32)arg2, 参数1为event，参数2为arg1。
                返回2
            ((uint32*)arg)[1] 为程序代码

type=0x8
    一般arg0 作为标签
    返回0


type=0x9
    直接跳转到目标标签arg0

type=0x2
    //应该设置状态event[0x3c]
    a0&0x7:
        一般等于9,17,25...
        1:
            a0>>3:
                0:
                    sub_80860A8(arg0)
                !0:
                    sub_80860BC(arg0)
    a0>>3:
        !=0:
            eventg[0x3c] |= 1<<(arg0>=0?arg0:0x30004B0[8])
        ==0:
            eventg[0x3c] &= ~(1<<(arg0>=0?arg0:0x30004B0[8]))

type=2b
    应该是设置当前事件的状态值
    v5 = arg0<0?0x30004B0[8]:arg0
    a0
        0:
            event[0x4c] = (byte)v5
        1:
            v5=v5<0?0:v5
            v5=v5>100:v5=100:v5;
            event[0x4e] = (byte)v5
        !=2:
            返回0
        2:
            event[0x4f] = event[0x4f]|0x80

type=2c
    加载游戏单位
    a0
        3:
            v5 = sub_80856E8();
            v6 = event[0x4c]?event[0x4c]:sub_800F704(v5)
            sub_800FAD0(v5,v6,event[0x4e],0);


type=0x3f
    切换战斗动画,
    a0 :
        0: 启用动画
        1: 地图形式攻击
        2: 没有任何画面


    arg[0], 右边角色id
    arg[1], 左边角色id
    判断栈顶有多少个元素,一个元素一个战斗,遇到0xffffffff时，则结束战斗
        [+0](byte)  攻击方 (0:左方,1:右方)
        [+1](byte)  伤害，如果是负数，则无伤害
        [+2](short)
            0:命中
            1:暴击
            2:miss
            3:miss
            4:命中
            5:暴击
            6:miss
            7:miss
            8:命中
            &0x800      瞬杀动作画面
            &0x4000     特效攻击动画画面
            &0x8000     敌方盾特性动画

type==0x1b
    a0 = 0,直接显示文本?

    a0 = 2,关闭文本显示?

type=0x2f
    a0 = 2,
        向特定方向移动一个
        arg[0] 为移动动画速度,8为正常速度
        arg[1] 为移动角色,
        arg[2] 为移动方向,0 左边，1，右边，2 下,3 上

    ?a1 = 1,
        向目标角色移动
        arg[0] 移动动画速度
        arg[1] 为移动角色
        arg[2] 为移动目标角色

    ?a2 = 0
        向目标位置移动
        arg[0] 移动动画速度
        arg[1] 为移动角色
        arg[2]&0xff  X坐标
        arg[2]>>0x8  Y坐标
    ?a2 = 3,
        用栈值作为移动目标

    a0>>3:
        1   移动目标到指定位置
            arg[0]|arg[1]   角色
            arg[2]          X|(Y<<8)



type=0x34
    操作目标单位
    如果arg[0] 为负数时
        小于-3，则arg[0] = 0
        =-3, 则 arg[0] = 30004B8[0]     相当于寄存器2(0540 0002 00000000id)
        =-1  则 arg[0] = 3004DF0[0]
        =-2  则 arg[0] = (30004DE[0]*4 + 202E4D4[0])[0] + 30004DC[0]


    a0 = 0
        arg[0] 目标单位
        关闭显示单位,
            设置单位状态0x4010001
    a0 = 1
        arg[0] 目标单位
        设置单位状态0xFBFEFFFE
    a0 = 2
        更改目标单位为我方
    a0 = 3
        更改目标单位为友方
    a0 = 4
        更改目标单位为敌方
    a0 = 6
        更改目标单位为已移动
    a0 = 0xd
        更改目标单位已死亡
    a0 = 0xe
        目标消失?
    a0 = 0xf
        被救援，消失?

    其他值
        8A61178 地址
        a0 = 0xa
        a0 = 0xc
        a0 = 0xb


type=0x17
    黑色背景
    arg[0] 为速度，数值越低，则速度越慢，越高则越快
    a0 = 1
        黑色背景淡入
    a0 = 0
        黑色背景淡出

    a0 = 2
        白色背景淡出
    a0 = 3
        白色背景淡入
    a0 > 3
        错误

type=0x25
    切换地图
    arg[0] 地图结构索引

type=2
    如果arg[0] 是负数，则是栈值
    a0&7
        0
            设定事件数据值
            (a0>>3)
                 0, 取消事件指针数据的位值 event[0x3c] &= ~(1<<arg[0])
                !0, 设定事件指针数据的位值 event[0x3c] |= ~(1<<arg[0])
        1
            (a0>>3)
                !0   sub_80860A8(arg[0])
                    *(byte*)(((arg0[0]-1)/8) + 0x3005260) |= 1<<(arg0[0]%8)
                    设置3005260 位偏移值
                0   sub_80860BC(arg[0])
                    取消3005260 位偏移值

                    如果位偏移值大于100时
                        位偏移值减去 101
                            arg[0] -= 101
                        基址由0x3005260更改为0x3005240

type=0x3b
    光标操作
        a0:
            2
                关闭光标
            1
                光标在arg[0]角色上显示


type=0x1b
    显示对话
        a0:
            0
                arg[0] 为文本索引
            1
                关闭对话

type=0x30
    等待所有操作完成

type=0x12
    切换音乐
        arg[0] 为音乐id

type=0x3a
    a0:
        0,  类似显示提示框，不过是居中显示，只有arg[0],arg[1]有作用，其他没作用

        1,  为显示关卡地点的显示
            显示关卡名字，
                arg[0] 为文本id
                arg[2] &0xff  在屏幕X坐标
                arg[2] >>0x8  在屏幕Y坐标
                arg[1] 没有作用
        2,  为显示胜利目标的显示效果
            同上


type=0x2c
    加载单位数据

type=0x26
    镜头移动
    a0:
        0
            arg[0]&0xff x坐标
            arg[0]>>8   y坐标
        1   移动镜头到目标角色
            arg[0]  为目标角色id


type=0x15
    有关音乐的操作?


type=0x37
    a0:
        0   给予道具给角色 (arg[0] 为角色id),道具值为 栈元素[3]
        1   未找到不同点
        2   202BCF4[0] = 202BCF4[0] - 30004B0[0xc](栈[3])


type=0x03
    a0:
        0
            设置30004E0 值 当前事件的值位偏移
        1
            设置30004E0 值 获得全局标志arg[0]为偏移
        >2:
            直接返回0

type=0x04
    a0:
        0
            设置30004E0 值为0
        !=0
            设置30004E0 为随机数

type=0xb
    arg1 = (int32)arg[1]
    arg1为负数时
        arg1 = 30004B8;
    a0
        1
            调用sub_8086100,跟获得章节事件结构偏移0x1c(教程?)


type=0x7
    a0
        1:
            把30004B4值压栈
        2:
            出栈，把值复制到arg[0]
        0:
            把 30004E0+arg[0]*4 的值压栈


type=0x41
    类似传送消失，传送显示的事件
    arg0 = arg[0]
    arg1 = arg[0]
    a0  =   0 上升显示(传送出)
        =   1 下降显示(传送到)
        =   f 如果没有412f，则转移的时候不会等待
        如果arg[0]为负数，则
            arg0 = 30004DC[0]   栈1     坐标X
            arg1 = 30004DE[0]   栈2     坐标Y
        8012A14(event,arg0,arg1)


type=0x33
    获得角色数据,
    arg[0] 为角色ID
    a0
        6:  获得坐标X,Y 分别写入30004E0,30004E2
        7:  获得角色职业ID
        8:  角色幸运?  0x19 +
        5:  获得角色阵营,  (0,我方,2敌方，1友方
        4:  判断角色是否存在，存在，则返回角色id
        3:  角色状态 & 0xC
        2:  角色状态 & 4, 是否已经移动?
        1:  角色角色状态和回合数(中毒，昏睡。。。)
        0:  获得角色指针


有关当前关卡，结束回合时触发的事件
    CharEvent[0]



*/